﻿using LBCMS.EntityFrameWork.FrameModel;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Threading.Tasks;
using WebApplication2.EntityFrameWork;

namespace LBCMS.EntityFrameWork
{
    public partial class BLLContext : DbContext
    {
        public BLLContext() : base("ConnString")
        {

        }

        public DbSet<B_Users> B_Users { set; get; }
        public DbSet<B_Code> B_Code { set; get; }
        public DbSet<B_Config> B_Config { set; get; }
        public DbSet<B_Module> B_Module { set; get; }
        public DbSet<B_Role> B_Role { set; get; }
        public DbSet<B_CodeValue> B_CodeValue { set; get; }
 

        public DbSet<B_Order> B_Order { set; get; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Add(new DecimalPrecisionAttributeConvention());
            base.OnModelCreating(modelBuilder);
        }


        //protected override void OnModelCreating(ModelBuilder modelBuilder)
        //{
        //    //foreach (Type classType in from t in Assembly.GetAssembly(typeof(DecimalPrecisionAttribute)).GetTypes()
        //    //                           where t.IsClass && t.Namespace == "YOURMODELNAMESPACE"
        //    //                           select t)
        //    //{
        //    //    foreach (var propAttr in classType.GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(p => p.GetCustomAttribute<DecimalPrecisionAttribute>() != null).Select(
        //    //           p => new { prop = p, attr = p.GetCustomAttribute<DecimalPrecisionAttribute>(true) }))
        //    //    {

        //    //        var entityConfig = modelBuilder.GetType().GetMethod("Entity").MakeGenericMethod(classType).Invoke(modelBuilder, null);
        //    //        ParameterExpression param = ParameterExpression.Parameter(classType, "c");
        //    //        Expression property = Expression.Property(param, propAttr.prop.Name);
        //    //        LambdaExpression lambdaExpression = Expression.Lambda(property, true,
        //    //                                                                 new ParameterExpression[]
        //    //                                                                     {param});
        //    //        DecimalPropertyConfiguration decimalConfig;
        //    //        if (propAttr.prop.PropertyType.IsGenericType && propAttr.prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
        //    //        {
        //    //            MethodInfo methodInfo = entityConfig.GetType().GetMethods().Where(p => p.Name == "Property").ToList()[7];
        //    //            decimalConfig = methodInfo.Invoke(entityConfig, new[] { lambdaExpression }) as DecimalPropertyConfiguration;
        //    //        }
        //    //        else
        //    //        {
        //    //            MethodInfo methodInfo = entityConfig.GetType().GetMethods().Where(p => p.Name == "Property").ToList()[6];
        //    //            decimalConfig = methodInfo.Invoke(entityConfig, new[] { lambdaExpression }) as DecimalPropertyConfiguration;
        //    //        }

        //    //        decimalConfig.HasPrecision(propAttr.attr.Precision, propAttr.attr.Scale);
        //    //    }
        //    //}

        //    base.OnModelCreating(modelBuilder);
        //}
    }
}
